package main;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingConstants;

public class InterfacePrincipal extends JFrame implements Observer{
	private static final long serialVersionUID = 1L;
	// VARIAVEIS PRINCIAPAIS
	@SuppressWarnings("unused")
	private estado _estado;
	private Modelo _modelo;
	
	// MENU
	private JMenuBar MBmenuBar;
	private JMenu Mrepositorio ;
	private JMenuItem MIprogramaBotao, MImedia, MIsomatorio, MIsair, MIcalculaFormula;
	
	// OUTROS
	private Container cp;
	private InterfaceCalcular _calcula;
	private InterfacePrograma _programa;
	private InterfaceMedia _media;
	private InterfaceSomatorio _somatorio;
	
	
	public InterfacePrincipal(Modelo modelo) {
		/*MERGE TEST*/
		
		_modelo = modelo;
		_modelo.setInterfacePrincipal(this);
		cp=getContentPane();
		cp.setLayout(null);
		setTitle("GPS Team7 - Calculadora de Funções");
		setSize(500,420);
		//setBounds(500,200,340,425); //<--- define tambem a posicao no ecra
		InicializeComponents();
		addComponents();
		addListeners();
		
		setJMenuBar(MBmenuBar);
		
		// * colocar sempre a janela no centro do ecra *
		// tamanho do ecra
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		 
		// determinar a nova localizacao da janela
		int w = this.getSize().width;
		int h = this.getSize().height;
		int x = (dim.width-w)/2;
		int y = (dim.height-h)/2;
		 
		// move a janela
		this.setLocation(x, y);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setResizable(false); //<--- nao permite maximizacao da janela
		
		
		setVisible(true);
		
	}
	
	private void addComponents() {

		MBmenuBar.add(MIprogramaBotao);
		MBmenuBar.add(MIcalculaFormula);
		MBmenuBar.add(Mrepositorio);
		Mrepositorio.add(MImedia);
		Mrepositorio.add(MIsomatorio);
		MBmenuBar.add(MIsair);
		cp.add(_calcula);
	}
	
	private void addListeners(){
		MIcalculaFormula.addActionListener(new calculaListener());
		MIprogramaBotao.addActionListener(new programaListener());
		MImedia.addActionListener(new mediaListener());
		MIsomatorio.addActionListener(new somatorioListener());
		MIsair.addActionListener(new sairListener());
	}
	
	private void InicializeComponents() {
		_estado = estado.Calcular;
		//menu bar
		MBmenuBar=new JMenuBar();

		Dimension d = new Dimension(140, 20);
		MIprogramaBotao=new JMenuItem("Programar Botão");
		MIprogramaBotao.setEnabled(true);
		MIprogramaBotao.setSize(d);
		MIprogramaBotao.setPreferredSize(d);
		MIprogramaBotao.setMinimumSize(d);
		MIprogramaBotao.setMaximumSize(d);
		MIcalculaFormula=new JMenuItem("Calcular Fórmula");
		MIcalculaFormula.setEnabled(true);
		MIcalculaFormula.setSize(d);
		MIcalculaFormula.setPreferredSize(d);
		MIcalculaFormula.setMinimumSize(d);
		MIcalculaFormula.setMaximumSize(d);
		Mrepositorio=new JMenu("Repositório");
		Mrepositorio.setEnabled(true);
		Mrepositorio.setSize(d);
		Mrepositorio.setPreferredSize(d);
		Mrepositorio.setMinimumSize(d);
		Mrepositorio.setMaximumSize(d);
		MIsair=new JMenuItem("Sair");
		MIsair.setEnabled(true);
		
		//menu item 
		MImedia=new JMenuItem("Média");
		MImedia.setEnabled(true);
		MIsomatorio=new JMenuItem("Somatório");
		MIsomatorio.setEnabled(true);

		_calcula = new InterfaceCalcular(_modelo);
		_programa = new InterfacePrograma(_modelo);
		_media = new InterfaceMedia(_modelo);
		_somatorio = new InterfaceSomatorio(_modelo);
	}

	@Override
	public void update(Observable arg0, Object arg1) {
		_programa.repaint();
		_programa.revalidate();
		_media.repaint();
		_media.revalidate();
		_somatorio.repaint();
		repaint();
		_somatorio.revalidate();
		_calcula.revalidate();
		_calcula.repaint();
		
	}
	
	enum estado {
		Calcular,
		Programar,
		Media,
		Somatorio
	}
	public class calculaListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			cp.removeAll();
			cp.add(_calcula);
			_estado = estado.Calcular;
			revalidate();
			repaint();
		}
    }
	public class programaListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			cp.removeAll();
			cp.add(_programa);
			_estado = estado.Programar;
			revalidate();
			repaint();
		}
    }
	public class mediaListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			cp.removeAll();
			cp.add(_media);
			_estado = estado.Media;
			revalidate();
			repaint();
		}
    }
	public class somatorioListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			cp.removeAll();
			cp.add(_somatorio);
			_estado = estado.Somatorio;
			revalidate();
			repaint();
		}
    }
	public class sairListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			System.exit(0);
		}
    }
	
	
}

